package study.config;

import org.springframework.cloud.gateway.filter.ratelimit.KeyResolver;
import org.springframework.context.annotation.Bean;
import org.springframework.context.annotation.Configuration;
import reactor.core.publisher.Mono;

/**
 * 路由限流配置
 *
 *
 * 集成限流，Spring Cloud Gateway默认集成了Redis限流，可以对不同服务做不同维度的限流，如：IP限流、用户限流 、接口限流
 * 本文演示的是 IP限流 ，先添加redis依赖，添加KeyResolver，再添加配置，需启动redis,会自动在redis上建立request_rate_limiter这个key
 */
@Configuration
public class RateLimiterConfig {

    /*
        IP限流代码如下：
     */
    @Bean(value = "remoteAddrKeyResolver")
    public KeyResolver remoteAddrKeyResolver() {
        return exchange -> Mono.just(exchange.getRequest().getRemoteAddress().getAddress().getHostAddress());
    }

//    /*
//    用户限流，使用这种方式限流，请求路径中必须携带userId参数
//     */
//    @Bean
//    KeyResolver userKeyResolver() {
//        return exchange -> Mono.just(exchange.getRequest().getQueryParams().getFirst("userId"));
//    }
//
//    /*
//    接口限流，获取请求地址的uri作为限流key
//     */
//    @Bean
//    KeyResolver apiKeyResolver() {
//        return exchange -> Mono.just(exchange.getRequest().getPath().value());
//    }
}
